In [1]:
epochs = 50

Part 7 - FederatedDatasetを使ってのFederated Learning

さて、今回は新しいFederated Datasetsで使うツールを紹介します。私たちはPyTorchのDatasetクラスと同じように使えるFederatedDatasetというクラスを作成しました。FederatedDatasetFederatedDataLoaderにロードされます。FederatedDataLoaderはご推察の通り、PyTorchのDataLoaderクラスと同じように使えます。

Authors:

前回のレッスンで学んだサンドボックスを使用します。


In [2]:
import torch as th
import syft as sy
sy.create_sandbox(globals(), verbose=False)


Falling back to insecure randomness since the required custom op could not be found for the installed version of TensorFlow. Fix this by compiling custom ops. Missing file was '/home/ext-share/anaconda3/envs/py37/lib/python3.7/site-packages/tf_encrypted/operations/secure_random/secure_random_module_tf_1.15.2.so'
WARNING:tensorflow:From /home/ext-share/anaconda3/envs/py37/lib/python3.7/site-packages/tf_encrypted/session.py:24: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

---------------------------------------------------------------------------
DependencyError                           Traceback (most recent call last)
<ipython-input-2-53e262b6d205> in <module>
      1 import torch as th
      2 import syft as sy
----> 3 sy.create_sandbox(globals(), verbose=False)

~/anaconda3/envs/py37/lib/python3.7/site-packages/syft/sandbox.py in create_sandbox(gbs, verbose, download_data)
     29 
     30     if download_data and importlib.util.find_spec("sklearn") is None:
---> 31         raise DependencyError("sklearn", "scikit-learn")
     32 
     33     if download_data:  # pragma: no cover

DependencyError: The sklearn dependency is not installed. If you intend to use it, please install it at your command line with `pip install scikit-learn`.

データセットを検索しましょう


In [ ]:
boston_data = grid.search("#boston", "#data")
boston_target = grid.search("#boston", "#target")

モデルとオプティマイザーをロードしましょう


In [ ]:
n_features = boston_data['alice'][0].shape[1]
n_targets = 1

model = th.nn.Linear(n_features, n_targets)

ここで、取得したデータセットをFederatedDatasetへキャストします。そして、データを保持しているワーカーを確認してみましょう。


In [ ]:
# BaseDatasetsにデータセットを投入して型変換をします
datasets = []
for worker in boston_data.keys():
    dataset = sy.BaseDataset(boston_data[worker][0], boston_target[worker][0])
    datasets.append(dataset)

# FederatedDatasetオブジェクトを作成します
dataset = sy.FederatedDataset(datasets)
print(dataset.workers)
optimizers = {}
for worker in dataset.workers:
    optimizers[worker] = th.optim.Adam(params=model.parameters(),lr=1e-2)

用意したFederatedDatasetをオプションとともにFederatedDataLoaderへ投入します。


In [ ]:
train_loader = sy.FederatedDataLoader(dataset, batch_size=32, shuffle=False, drop_last=False)

最後はループ処理です。見ての通り、通常のPyTorchだけの実装とほとんど変わりはありません


In [ ]:
for epoch in range(1, epochs + 1):
    loss_accum = 0
    for batch_idx, (data, target) in enumerate(train_loader):
        model.send(data.location)
        
        optimizer = optimizers[data.location.id]
        optimizer.zero_grad()
        pred = model(data)
        loss = ((pred.view(-1) - target)**2).mean()
        loss.backward()
        optimizer.step()
        
        model.get()
        loss = loss.get()
        
        loss_accum += float(loss)
        
        if batch_idx % 8 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tBatch loss: {:.6f}'.format(
                epoch, batch_idx, len(train_loader),
                       100. * batch_idx / len(train_loader), loss.item()))            
            
    print('Total loss', loss_accum)

おめでとうございます!コミュニティに入ろう!

本チュートリアルを完了しました。おめでとうございます!もし、このチュートリアルを気に入って、プライバシーに配慮した非中央集権的なAI技術や付随する(データやモデルの)サプライチェーンにご興味があって、プロジェクトに参加したいと思われるなら、以下の方法で可能です。

PySyftのGitHubレポジトリにスターをつける

一番簡単に貢献できる方法はこのGitHubのレポジトリにスターを付けていただくことです。スターが増えると露出が増え、より多くのデベロッパーにこのクールな技術の事を知って貰えます。

Slackに入る

最新の開発状況のトラッキングする一番良い方法はSlackに入ることです。 下記フォームから入る事ができます。 http://slack.openmined.org

コードプロジェクトに参加する

コミュニティに貢献する一番良い方法はソースコードのコントリビューターになることです。PySyftのGitHubへアクセスしてIssueのページを開き、"Projects"で検索してみてください。参加し得るプロジェクトの状況を把握することができます。また、"good first issue"とマークされているIssueを探す事でミニプロジェクトを探すこともできます。

寄付

もし、ソースコードで貢献できるほどの時間は取れないけど、是非何かサポートしたいという場合は、寄付をしていただくことも可能です。寄附金の全ては、ハッカソンやミートアップの開催といった、コミュニティ運営経費として利用されます。

OpenMined's Open Collective Page


In [ ]:


In [ ]:


In [ ]:


In [ ]: